package model.entidades;

import java.util.Calendar;
import java.util.List;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

import utils.Constantes;


@Entity 
@Table(name="usuario", schema="public")
public class Usuario implements Comparable<Usuario> {
	
	@Id
	@GeneratedValue
	private int ID;

	@Column(nullable = false)
	private String nome;
	
	@Temporal(TemporalType.DATE)
	@Column(nullable = false)
	private Calendar dataNascimento;
	
	@Column(nullable = false, unique = true)
	private String cpf;
	
	private String rgNumero;
	private String rgOrgao;
	private String rgUF;
	
	@Column(nullable = false)
	private String sexo;
	
	private String email;
	private String telefone;
	private String celular;
	
	@Column(nullable = false, unique = true)
	private String login;
	
	@Column(nullable = false)
	private String senha;
	
	@Column(nullable = false)
	private String tipoPerfil;
	
	@Column(nullable = false)
	private String situacao;
	
	@OneToOne
	private DadosProfissional dadosProfissional;
	
	@ManyToMany
	@JoinTable(name="profissional_convenio", joinColumns = {@JoinColumn(name = "id_usuario")}, inverseJoinColumns={@JoinColumn(name="id_convenio")})
	private List<Convenio> conveniosAtendidos;

	/**
	 * @param iD
	 * @param nome
	 * @param dataNascimento
	 * @param cpf
	 * @param rgNumero
	 * @param rgOrgao
	 * @param rgUF
	 * @param sexo
	 * @param email
	 * @param telefone
	 * @param celular
	 * @param login
	 * @param senha
	 * @param tipoPerfil
	 * @param situacao
	 * @param dadosProfissional
	 */
	public Usuario(int iD, String nome, Calendar dataNascimento, String cpf,
			String rgNumero, String rgOrgao, String rgUF, String sexo,
			String email, String telefone, String celular, String login,
			String senha, String tipoPerfil, String situacao,
			DadosProfissional dadosProfissional) {
		super();
		ID = iD;
		this.nome = nome;
		this.dataNascimento = dataNascimento;
		this.cpf = cpf;
		this.rgNumero = rgNumero;
		this.rgOrgao = rgOrgao;
		this.rgUF = rgUF;
		this.sexo = sexo;
		this.email = email;
		this.telefone = telefone;
		this.celular = celular;
		this.login = login;
		this.senha = senha;
		this.tipoPerfil = tipoPerfil;
		this.situacao = situacao;
		this.dadosProfissional = dadosProfissional;
	}
	
	/**
	 * @param nome
	 * @param dataNascimento
	 * @param cpf
	 * @param rgNumero
	 * @param rgOrgao
	 * @param rgUF
	 * @param sexo
	 * @param email
	 * @param telefone
	 * @param celular
	 * @param login
	 * @param senha
	 * @param tipoPerfil
	 * @param situacao
	 * @param dadosProfissional
	 */
	public Usuario(String nome, Calendar dataNascimento, String cpf,
			String rgNumero, String rgOrgao, String rgUF, String sexo,
			String email, String telefone, String celular, String login,
			String senha, String tipoPerfil, String situacao,
			DadosProfissional dadosProfissional) {
		super();
		this.nome = nome;
		this.dataNascimento = dataNascimento;
		this.cpf = cpf;
		this.rgNumero = rgNumero;
		this.rgOrgao = rgOrgao;
		this.rgUF = rgUF;
		this.sexo = sexo;
		this.email = email;
		this.telefone = telefone;
		this.celular = celular;
		this.login = login;
		this.senha = senha;
		this.tipoPerfil = tipoPerfil;
		this.situacao = situacao;
		this.dadosProfissional = dadosProfissional;
	}

	/**
	 * @param nome
	 * @param dataNascimento
	 * @param cpf
	 * @param sexo
	 * @param login
	 * @param senha
	 * @param tipoPerfil
	 * @param situacao
	 */
	public Usuario(String nome, Calendar dataNascimento, String cpf,
			String sexo, String login, String senha, String tipoPerfil,
			String situacao) {
		super();
		this.nome = nome;
		this.dataNascimento = dataNascimento;
		this.cpf = cpf;
		this.sexo = sexo;
		this.login = login;
		this.senha = senha;
		this.tipoPerfil = tipoPerfil;
		this.situacao = situacao;
	}

	/**
	 * 
	 */
	public Usuario() {
		super();
	}
	
	

	/**
	 * @return the iD
	 */
	public int getID() {
		return ID;
	}

	/**
	 * @param iD the iD to set
	 */
	public void setID(int iD) {
		ID = iD;
	}

	/**
	 * @return the nome
	 */
	public String getNome() {
		return nome;
	}

	/**
	 * @param nome the nome to set
	 */
	public void setNome(String nome) {
		this.nome = nome;
	}

	/**
	 * @return the dataNascimento
	 */
	public Calendar getDataNascimento() {
		return dataNascimento;
	}

	/**
	 * @param dataNascimento the dataNascimento to set
	 */
	public void setDataNascimento(Calendar dataNascimento) {
		this.dataNascimento = dataNascimento;
	}

	/**
	 * @return the cpf
	 */
	public String getCpf() {
		return cpf;
	}

	/**
	 * @param cpf the cpf to set
	 */
	public void setCpf(String cpf) {
		this.cpf = cpf;
	}

	/**
	 * @return the rgNumero
	 */
	public String getRgNumero() {
		return rgNumero;
	}

	/**
	 * @param rgNumero the rgNumero to set
	 */
	public void setRgNumero(String rgNumero) {
		this.rgNumero = rgNumero;
	}

	/**
	 * @return the rgOrgao
	 */
	public String getRgOrgao() {
		return rgOrgao;
	}

	/**
	 * @param rgOrgao the rgOrgao to set
	 */
	public void setRgOrgao(String rgOrgao) {
		this.rgOrgao = rgOrgao;
	}

	/**
	 * @return the rgUF
	 */
	public String getRgUF() {
		return rgUF;
	}

	/**
	 * @param rgUF the rgUF to set
	 */
	public void setRgUF(String rgUF) {
		this.rgUF = rgUF;
	}

	/**
	 * @return the sexo
	 */
	public String getSexo() {
		return sexo;
	}

	/**
	 * @param sexo the sexo to set
	 */
	public void setSexo(String sexo) {
		this.sexo = sexo;
	}

	/**
	 * @return the email
	 */
	public String getEmail() {
		return email;
	}

	/**
	 * @param email the email to set
	 */
	public void setEmail(String email) {
		this.email = email;
	}

	/**
	 * @return the telefone
	 */
	public String getTelefone() {
		return telefone;
	}

	/**
	 * @param telefone the telefone to set
	 */
	public void setTelefone(String telefone) {
		this.telefone = telefone;
	}

	/**
	 * @return the celular
	 */
	public String getCelular() {
		return celular;
	}

	/**
	 * @param celular the celular to set
	 */
	public void setCelular(String celular) {
		this.celular = celular;
	}

	/**
	 * @return the login
	 */
	public String getLogin() {
		return login;
	}

	/**
	 * @param login the login to set
	 */
	public void setLogin(String login) {
		this.login = login;
	}

	/**
	 * @return the senha
	 */
	public String getSenha() {
		return senha;
	}

	/**
	 * @param senha the senha to set
	 */
	public void setSenha(String senha) {
		this.senha = senha;
	}

	/**
	 * @return the tipoPerfil
	 */
	public String getTipoPerfil() {
		return tipoPerfil;
	}

	/**
	 * @param tipoPerfil the tipoPerfil to set
	 */
	public void setTipoPerfil(String tipoPerfil) {
		this.tipoPerfil = tipoPerfil;
	}

	/**
	 * @return the ativo
	 */
	public String getSituacao() {
		return situacao;
	}

	/**
	 * @param ativo the ativo to set
	 */
	public void setSituacao(String situacao) {
		this.situacao = situacao;
	}

	/**
	 * @return the dadosProfissional
	 */
	public DadosProfissional getDadosProfissional() {
		return dadosProfissional;
	}

	/**
	 * @param dadosProfissional the dadosProfissional to set
	 */
	public void setDadosProfissional(DadosProfissional dadosProfissional) {
		this.dadosProfissional = dadosProfissional;
	}

	/**
	 * @return the conveniosAtendidos
	 */
	public List<Convenio> getConveniosAtendidos() {
		return conveniosAtendidos;
	}

	/**
	 * @param conveniosAtendidos the conveniosAtendidos to set
	 */
	public void setConveniosAtendidos(List<Convenio> conveniosAtendidos) {
		this.conveniosAtendidos = conveniosAtendidos;
	}

	/* (non-Javadoc)
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString() {
		
		if(getTipoPerfil().equalsIgnoreCase(Constantes.TIPO_PERFIL_PROFISSIONAL)){
			return getNome() + " - " + getDadosProfissional().getEspecialidade();
		} else {
			return getNome() + " - " + getTipoPerfil();
		}
		
	}

	@Override
	public int compareTo(Usuario usuario) {
		return getNome().compareTo(usuario.getNome());
	}
	
}//Usuario.class
